<?php

class UsersController extends AppController {

    var $name = 'Users';
    var $uses = array('User', 'Group', 'Cash');

    function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow('*');
        $this->Auth->allow(array('login'));
        // Limito que si ya esta conectado, no pueda entrar a loguearse de nuevo
        if (in_array($this->action, array('login')) and $this->Auth->user('id')) {
            $this->redirect(array('user' => false, 'controller' => 'futures', 'action' => 'index'));
        }

        //si no es un usuario del tipo admin, no le permito realizar ciertas acciones
        if ($this->Auth->user('group_id') != GROUP_ADMIN and in_array($this->action, array('index', 'add', 'edit', 'view', 'delete', 'change_status'))) {
            $this->Session->setFlash(__('Acceso Restringido', true));
            $this->redirect(array('controller' => 'futures', 'action' => 'index'));
        }
    }

    /**
     * Lleva a la vista donde se le permite a un usuario loguearse
     * y realiza la acción de logueo con los datos del formulario
     */
    function login() {


//        die($this->Auth->password('123456'));
        $this->layout = 'login';
        $this->set('title_for_layout', __('Iniciar sesión', true));

        if ($this->Auth->user()) {
            
            //si el usuario se logueo bien, entonces voy a controlar si ya hay una
            //caja creada para el día de hoy, en caso de no haberla, voy a crear
            //una nueva para hoy, iniciando con el monto que cerro la caja del día anterior
            $this->Cash->getActual();

            //redirigimos a donde corresponda
            $this->redirect(array('controller' => 'futures', 'action' => 'index'));
        }
    }

    function logout() {
        //solamente deslogueo al usuario
        $this->redirect($this->Auth->logout());
    }

    /**
     * Función que setea el estado de la variable de session "mostrar_menu_entero"
     */
    function set_session_menu($status) {
        Configure::write('debug', 0);
        $this->layout = 'ajax';
        $this->Session->write('mostrar_menu_entero', $status);
        echo '';
        die;
    }

    /**
     * Función que realiza un backup de la base de datos, es llamada por ajax
     */
    function create_backup() {

        //borro todo el contenido de la carpeta de los backups
        exec('del /q C:\xampp\htdocs\festilu\app\webroot\files\mysql_backup\*', $salida);

        $nombre_archivo = date("Y-m-d-H-i-s") . '.zip';
        $backupFile = "C:\\xampp\\htdocs\\festilu\\app\\webroot\\files\\mysql_backup\\backup_festilu_" . $nombre_archivo;

        $command = "C:\\xampp\\mysql\\bin\\mysqldump.exe --opt --user=root festilu | zip > $backupFile";
        exec($command, $salida);

        $dir_file = SITE_URL . '/files/mysql_backup/backup_festilu_' . $nombre_archivo;
        echo $dir_file;
        die;
    }

    /**
     * Función que restaura el backup subido por el usuario
     */
    function restore_backup() {

        if (!empty($this->data)) {
            //si vienen datos del formulario
            if ($_FILES['data']['error']['User']['archivo'] == 0) {

                //borro todo el contenido de la carpeta de los backups
                exec('del /q C:\xampp\htdocs\festilu\app\webroot\files\mysql_backup\*', $salida);

                //si se tomo bien el archivo
                $dir_file = $_FILES['data']['tmp_name']['User']['archivo'];

                //descomprimo el archivo
                $command = "unzip $dir_file -d C:\\xampp\\htdocs\\festilu\\app\\webroot\\files\\mysql_backup";
                exec($command, $salida1);

                //lo copio y le cambio el nombre para ponerle la extension .sql
                $command = "copy C:\\xampp\\htdocs\\festilu\\app\\webroot\\files\\mysql_backup\\- C:\\xampp\\htdocs\\festilu\\app\\webroot\\files\\mysql_backup\\backup.sql";
                exec($command, $salida2);

                //ahora lo importo en la base de datos pisando todos los datos
                $command = "C:\\xampp\\mysql\\bin\\mysql.exe --user=root festilu < C:\\xampp\\htdocs\\festilu\\app\\webroot\\files\\mysql_backup\\backup.sql";
                exec($command, $salida3);

                if ($salida3) {
                    $this->Session->setFlash(__('El Backup no pudo ser restaurado. Por favor, intente nuevamente.', true));
                } else {
                    $this->Session->setFlash(__('El Backup ha sido restaurado.', true));
                }
            } else {
                $this->Session->setFlash(__('El archivo no se subió correctamente. Por favor, intente nuevamente.', true));
            }
        }
    }

    function index() {
        $this->User->recursive = 0;
        $this->paginate['order'] = array('User.group_id' => 'ASC', 'User.name' => 'ASC');
        $this->set('users', $this->paginate(array('deleted' => 0)));
    }

    function view($id = null) {

        if (!$id) {
            $this->Session->setFlash(__('Usuario Inexistente', true));
            $this->redirect(array('action' => 'index'));
        }
        $this->set('user', $this->User->read(null, $id));
    }

    function add() {

        if (!empty($this->data)) {
            $datos = $this->data['User'];

            //controlo que las contraseñas coincidan
            if ($datos['password'] != $this->Auth->password($datos['password_repeat'])) {
                $this->Session->setFlash(__('Las contraseñas no coinciden', true));
                unset($this->data['User']['password']);
                unset($this->data['User']['password_repeat']);
            } else {

                $this->User->create();
                if ($this->User->save($datos)) {
                    $this->Session->setFlash(__('El Usuario ha sido creado', true));
                    $this->redirect(array('action' => 'index'));
                } else {
                    $this->Session->setFlash(__('El Usuario no ha sido creado. Por favor, intente nuevamente.', true));
                }
            }
        }

        $this->set('groups', $this->Group->find('list'));
    }

    function edit($id = null) {
        if (!$id && empty($this->data)) {
            $this->Session->setFlash(__('Usuario Inexistente', true));
            $this->redirect(array('action' => 'index'));
        }
        if (!empty($this->data)) {
            if ($this->User->save($this->data)) {
                $this->Session->setFlash(__('El Usuario ha sido editado', true));
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('El Usuario no ha sido editado. Por favor, intente nuevamente.', true));
            }
        }
        if (empty($this->data)) {
            $this->data = $this->User->read(null, $id);
        }

        $this->set('groups', $this->Group->find('list'));
    }

    function delete($id = null) {
        if (!$id) {
            $this->Session->setFlash(__('Usuario Inexistente', true));
            $this->redirect(array('action' => 'index'));
        }
        //controlo que no pueda eliminar su propio usuario
        if ($id == $this->Auth->user('id')) {
            $this->Session->setFlash(__('No puedes eliminar tu propio usuario', true));
            $this->redirect(array('action' => 'index'));
        }

        $this->User->id = $id;
        if ($this->User->saveField('deleted', 1)) {
            $this->Session->setFlash('El Usuario ha sido eliminado');
            $this->redirect(array('action' => 'index'));
        }
        $this->Session->setFlash('El Usuario no ha sido eliminado. Por favor, intente nuevamente.');
        $this->redirect(array('action' => 'index'));
    }

    function change_status($id = null, $value = 4) {
        if (!$id) {
            $this->Session->setFlash(__('Usuario Inexistente', true));
            $this->redirect(array('action' => 'index'));
        }

        //controlo que el valor sea 0 o 1
        if ($value != 1 && $value != 0) {
            $this->Session->setFlash(__('Operación inválida', true));
            $this->redirect(array('action' => 'index'));
        }

        //controlo que no pueda cambiar el estado su propio usuario
        if ($id == $this->Auth->user('id')) {
            $this->Session->setFlash(__('No puedes cambiar el estado de tu propio usuario', true));
            $this->redirect(array('action' => 'index'));
        }

        $texto = $value == 1 ? 'habilitado' : 'deshabilitado';

        $this->User->id = $id;
        if ($this->User->saveField('enabled', $value)) {
            $this->Session->setFlash('El Usuario ha sido ' . $texto);
            $this->redirect(array('action' => 'index'));
        }
        $this->Session->setFlash("El Usuario no ha sido $texto. Por favor, intente nuevamente.");
        $this->redirect(array('action' => 'index'));
    }

    function change_password($id = null) {

        //controlo que si es un usuario de tipo común, solo puede modificar su propio usuario
        if ($this->Auth->user('group_id') != GROUP_ADMIN || !$id) {
            $id = $this->Auth->user('id');
        }

        $usuario = $this->User->find('first', array(
            'recursive' => -1,
            'conditions' => array(
                'User.id' => $id
            )
                ));

        //controlo que exista el usuario
        if (empty($usuario)) {
            $this->Session->setFlash(__('Usuario Inexistente', true));
            $this->redirect(array('action' => 'index'));
        }

        if (!empty($this->data)) {

            $datos = $this->data['User'];

            $datos['id'] = $id;
            $datos['password'] = $this->Auth->password($datos['password']);

            //controlo que las contraseñas coincidan
            if ($datos['password'] != $this->Auth->password($datos['password_repeat'])) {
                $this->Session->setFlash(__('Las contraseñas no coinciden', true));
                unset($this->data['User']['password']);
                unset($this->data['User']['password_repeat']);
            } else {

                if ($this->User->save($datos)) {
                    $this->Session->setFlash(__('La contraseña ha sido editada', true));
                    if ($this->Auth->user('group_id') == GROUP_ADMIN) {
                        $this->redirect(array('action' => 'index'));
                    } else {
                        $this->redirect(array('controller' => 'futures', 'action' => 'index'));
                    }
                } else {
                    $this->Session->setFlash(__('La contraseña no ha sido editada. Por favor, intente nuevamente.', true));
                }
            }
        }

        $this->set('user', $usuario);
    }

}